export const getInputs = () => [
	[
		[
			[0, 11, 16, 5, 20],
			[17, 4, 19, 10, 15],
			[12, 1, 8, 21, 6],
			[3, 18, 23, 14, 9],
			[24, 13, 2, 7, 22],
		],
	],
	[
		[
			[0, 3, 6],
			[5, 8, 1],
			[2, 7, 4],
		],
	],
	[
		[
			[0, 11, 16, 5, 20],
			[17, 4, 19, 10, 15],
			[12, 1, 8, 21, 6],
			[3, 18, 23, 14, 9],
			[24, 13, 2, 7, 22],
		],
	],
	[
		[
			[24, 11, 22, 17, 4],
			[21, 16, 5, 12, 9],
			[6, 23, 10, 3, 18],
			[15, 20, 1, 8, 13],
			[0, 7, 14, 19, 2],
		],
	],
];

/**
 * **[6322. 检查骑士巡视方案](https://leetcode.cn/contest/weekly-contest-337/problems/check-knight-tour-configuration/)**
 *
 * 骑士在一张 `n x n` 的棋盘上巡视。在有效的巡视方案中，骑士会从棋盘的 **左上角** 出发，并且访问棋盘上的每个格子 **恰好一次** 。
 *
 * 给你一个 `n x n` 的整数矩阵 `grid` ，由范围 `[0, n * n - 1]` 内的不同整数组成，其中 `grid[row][col]` 表示单元格 `(row, col)` 是骑士访问的第 `grid[row][col]` 个单元格。骑士的行动是从下标 **0** 开始的。
 *
 * 如果 `grid` 表示了骑士的有效巡视方案，返回 `true`；否则返回 `false`。
 *
 * **注意**，骑士行动时可以垂直移动两个格子且水平移动一个格子，或水平移动两个格子且垂直移动一个格子。下图展示了骑士从某个格子出发可能的八种行动路线。
 *
 * ![](https://assets.leetcode.com/uploads/2018/10/12/knight.png)
 *
 * @param grid
 * @returns
 */
export default function (grid: number[][]): boolean {
	if (grid[0][0] !== 0) return false;

	const gridLength = grid.length;

	const map = new Map<number, { x: number; y: number }>();
	for (let i = 0; i < gridLength; i++) {
		for (let j = 0; j < gridLength; j++) {
			map.set(grid[i][j], {
				x: i,
				y: j,
			});
		}
	}

	const maxValue = gridLength * gridLength - 1;
	for (let val = 0; val < maxValue; val++) {
		const { x: x1, y: y1 } = map.get(val)!;
		const { x: x2, y: y2 } = map.get(val + 1)!;

		if (
			(Math.abs(x1 - x2) === 1 && Math.abs(y1 - y2) === 2) ||
			(Math.abs(x1 - x2) === 2 && Math.abs(y1 - y2) === 1)
		)
			continue;

		return false;
	}
	return true;
}
